﻿// 界面头文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "datainfowindow.h"
#include "ui_datainfowindow.h"

// 文件管理器头文件
#include <QUrlQuery>
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>

// 消息框头文件
#include <QMessageBox>

// 网络JSON数据解析头文件
#include <QJsonParseError>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , imgManager(nullptr)
    , cam(nullptr)
    , view(nullptr)
    , capture(nullptr)

{
    ui->setupUi(this);

    // 初始化时设置cameralabel的属性
//    ui->cameralabel->setScaledContents(false);
//    ui->cameralabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}

MainWindow::~MainWindow()
{
//    QFile::remove("my_database.db"); // 删除数据库文件

    // 释放摄像头资源
    if(cam) {
            cam->stop();
            delete cam;
        }
    // 释放主界面资源
    delete ui;
}

// 获取最后一条记录的 ID
int getLastRecordId() {
    QSqlQuery query;
    query.exec("SELECT id FROM photos ORDER BY id DESC LIMIT 1");
    return query.next() ? query.value(0).toInt() : -1;
}

// 更新指定字段
bool updateField(int id, const QString &column, const QString &column2, const QString &column3, const QVariant &value, const QVariant &value2, const QVariant &value3) {
    QSqlQuery query;
    query.prepare(QString("UPDATE photos SET %1 = ?, %2 = ?, %3 = ? WHERE id = ?").arg(column, column2, column3));
    query.addBindValue(value);
    query.addBindValue(value2);
    query.addBindValue(value3);
    query.addBindValue(id);
    return query.exec();
}

// 获取JSON解析后的动植物数据
void MainWindow::RecvAnimalMsg(QNetworkReply *reply)
{
    qDebug() << __LINE__  ;
    if(reply->error() == QNetworkReply::NoError)
    {
         QByteArray msg = reply->readAll();

         // 从UI界面获网络中直接获得Json的数据，并通过fromJson静态函数直接把这些数据构造一个QJsonDocument返回
         QJsonParseError parseError;
         // 转换为 QJsonDocument
         QJsonDocument jsonDoc = QJsonDocument::fromJson(msg, &parseError);

         // 检查转换是否成功
         if (parseError.error != QJsonParseError::NoError) {
             qDebug() << "JSON 解析错误：" << parseError.errorString();
             return;
         }

         // 成功转换后，可以操作 jsonDoc
         if (jsonDoc.isObject()) {
             QJsonObject jsonObj = jsonDoc.object();
             qDebug() << "解析结果：" << jsonObj;
         }

         // 把json文档jsonDoc 转换为 jsonObj
         QJsonObject obj = jsonDoc.object();

         // 得到一个double类型的数据并直接输出
         qDebug() << obj.value( "log_id").toDouble() ;

         // 得到一个Json数组
         QJsonArray array = obj.value( "result").toArray();

         QVariant value;
         if (flag_recognition == 1) {
             value = "动物";
         }
         if (flag_recognition == 2) {
             value = "植物";
         }
         QVariant value2;
         QVariant value3;
         // 遍历数组
         for( int i = 0 ; i < array.size() ; i ++  )
         {
             QJsonObject ArrObj = array[0].toObject();
             ui->nameEdit->setText(ArrObj.value("name").toString());
             value2 = ArrObj.value("name").toString();

             QJsonObject BaiKeObj = ArrObj.value("baike_info").toObject();
             ui->descriptionEdit->setText(BaiKeObj.value("description").toString());
             value3 = BaiKeObj.value("description").toString();
         }

         // 连接数据库
         QSqlDatabase db = QSqlDatabase::database(); // 如果已连接，直接获取
         if (!db.isOpen()) {
             db = QSqlDatabase::addDatabase("QSQLITE");
             db.setDatabaseName("my_database.db");
             if (!db.open()) {
                 qDebug() << "Error: Database connection failed!" << db.lastError();
                 return;
             }
         }

         int lastId = getLastRecordId();
         if (lastId != -1) {
             if (updateField(lastId, "type_ani_pla", "name_ani_pla", "detail_ani_pla", value, value2, value3)) {
                 qDebug() << "Record updated successfully!";
             } else {
                 qDebug() << "Update error:" << db.lastError();
             }
         } else {
             qDebug() << "No records found!";
         }

         // 关闭数据库
         db.close();


//         ui->textEdit->setText(msg);

    }

}

// 识别图片
void MainWindow::on_recognitionButton_clicked()
{
//    // 通过预设对话框来选择指定的文件名字
//    QString FilePath = QFileDialog::getOpenFileName();

//    // 设置图片大小
//    QPixmap img = (FilePath);
//    QPixmap newImg = img.scaled( ui->Imglabel->size() );

//    // UI中显示图片
//    ui->Imglabel->setPixmap( newImg );

    // 连接并打开数据库
    QSqlDatabase db = QSqlDatabase::database(); // 如果已连接，直接获取
    if (!db.isOpen()) {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("my_database.db");
        if (!db.open()) {
            qDebug() << "Error: Database connection failed!" << db.lastError();
            return;
        }
    }

    QSqlQuery SQLquery;
    // 按 id 降序排序，获取最后一条记录
    SQLquery.prepare("SELECT image_data FROM photos ORDER BY id DESC LIMIT 1");

    if (!SQLquery.exec() || !SQLquery.next()) {
        qDebug() << "Error: Failed to fetch image!" << SQLquery.lastError();
        return;
    }

    // 获取 BLOB 数据并转换为 QImage
    QByteArray imageData = SQLquery.value("image_data").toByteArray();
    QImage image;
    image.loadFromData(imageData);

    // 显示图片（例如在 QLabel 中）
    ui->Imglabel->setPixmap(QPixmap::fromImage(image).scaled(ui->Imglabel->size(), Qt::KeepAspectRatio));

    // 构造好请求的对象，并设定好请求的URL地址
    // 动物图片识别URL: https://aip.baidubce.com/rest/2.0/image-classify/v1/animal
    // 植物图片识别URL: https://aip.baidubce.com/rest/2.0/image-classify/v1/plant
    // Token: 24.624933449e259399b459ce0029384cc5.2592000.1753278517.282335-119328556
    QString baseUrl;
    if (flag_recognition == 1) {
        baseUrl = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal";
        qDebug() << "baseUrl = " << baseUrl;
    }
    if (flag_recognition == 2) {
        baseUrl = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant";
        qDebug() << "baseUrl = " << baseUrl;
    }
//    QString encodedUrl = QUrl::toPercentEncoding(baseUrl); // 不需要对 baseUrl 进行编码（url不需要特殊字符转换为%）
    QString token = "24.624933449e259399b459ce0029384cc5.2592000.1753278517.282335-119328556";
    QString encodedToken = QUrl::toPercentEncoding(token); // 对 token 进行编码
    QString fullUrl = baseUrl + "?access_token=" + encodedToken;
    qDebug() << "valid URL:" << fullUrl;
    QUrl url(fullUrl);
    if (!url.isValid()) {
        qDebug() << "Invalid URL:" << url.errorString();
        return;
    }
    QNetworkRequest request(url);

    // 设置请求头的数据
    request.setHeader(QNetworkRequest::ContentTypeHeader ,
                      "application/x-www-form-urlencoded" ) ;

    //准备好请求包体
    QUrlQuery query ;
    // 把图像数据转为Base64格式并以URL编码返回
    QByteArray base64Img = ToBase64( imageData );
    // 添加image 表单参数
    query.addQueryItem( "image" , base64Img );
    query.addQueryItem( "top_num" , "1" );
    query.addQueryItem( "baike_num" , "1" );

    // 把表单数据转换为QByteArray类型
    QByteArray data = query.toString().toUtf8();

    // 构造请求管理对象
    imgManager = new QNetworkAccessManager ;
    // 发起post请求
    imgManager->post(  request , data );

    // 连接信号与槽等待请求响应结束
    connect( imgManager , &QNetworkAccessManager::finished,
             this , &MainWindow::RecvAnimalMsg );
}

// 图片转为base64数据
QByteArray MainWindow::ToBase64(QByteArray imgData)
{
    // 图片需要base64编码
    QByteArray Base64Img = imgData.toBase64();

    // 构造好一个编码转换器
    QTextCodec * codec = QTextCodec::codecForName("utf-8");
    // 把数据按照百度的要求转换为 去掉编码头后再进行urlencode
    QByteArray imgEncode = codec->fromUnicode(Base64Img)
                                .toPercentEncoding();

    return imgEncode;
}

// 动物识别标记按钮的点击事件槽函数
void MainWindow::on_animalrecButton_clicked()
{
    // flag_recognition标志为1识别动物
    flag_recognition = 1;

    //创建一个消息对话框对象
    QMessageBox msgBox;
    //设置消息对话框的文本
    msgBox.setText("现在处于动物识别模式，请识别动物!");  // 确保源码是 UTF-8
    //以模态的方式显示消息对话框
    msgBox.exec();
}

// 植物识别标记按钮的点击事件槽函数
void MainWindow::on_plantrecButton_clicked()
{
    // flag_recognition标志为2识别植物
    flag_recognition = 2;

    //创建一个消息对话框对象
    QMessageBox msgBox;
    //设置消息对话框的文本
    msgBox.setText("现在处于植物识别模式，请识别植物!");  // 确保源码是 UTF-8
    //以模态的方式显示消息对话框
    msgBox.exec();
}

// 切换数据信息显示窗口的点击事件槽函数
void MainWindow::on_dataButton_clicked()
{
    //第一步：创建另一个界面的对象  new MainWindow(this) 把父窗口传递过去，记录从哪一个界面跳转
    DataInfoWindow *datainfowindow = new DataInfoWindow(this);
    datainfowindow->setAttribute(Qt::WA_DeleteOnClose);//关闭之后自动销毁对象
    //第二步：显示要跳转的界面
    datainfowindow->show();
    //第三步：隐藏当前的界面,跳转到另一个界面之后，点击返回按钮还可以返回当前界面
    this->hide();
}
